package StructurePattern.Composite;

/**
 * @author: Themberfue
 * @date: 2025/8/12 11:14
 * @description:
 */
import java.util.ArrayList;
import java.util.List;

// 1. 抽象组件（文件系统节点）
interface FileSystemComponent {
    String getName();
    long getSize();
    void print(String prefix); // 打印节点信息，prefix用于缩进显示层级
}

// 2. 叶子节点（文件）
class File implements FileSystemComponent {
    private String name;
    private long size; // 文件大小（字节）

    public File(String name, long size) {
        this.name = name;
        this.size = size;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public long getSize() {
        return size;
    }

    @Override
    public void print(String prefix) {
        System.out.println(prefix + "文件: " + name + " (" + size + " bytes)");
    }
}

// 3. 组合节点（文件夹）
class Directory implements FileSystemComponent {
    private String name;
    private List<FileSystemComponent> children; // 子节点（可以是文件或文件夹）

    public Directory(String name) {
        this.name = name;
        this.children = new ArrayList<>();
    }

    // 添加子节点
    public void add(FileSystemComponent component) {
        children.add(component);
    }

    // 移除子节点
    public void remove(FileSystemComponent component) {
        children.remove(component);
    }

    @Override
    public String getName() {
        return name;
    }

    // 文件夹大小是所有子节点大小的总和
    @Override
    public long getSize() {
        long totalSize = 0;
        for (FileSystemComponent component : children) {
            totalSize += component.getSize();
        }
        return totalSize;
    }

    // 递归打印所有子节点
    @Override
    public void print(String prefix) {
        System.out.println(prefix + "文件夹: " + name + " (" + getSize() + " bytes)");
        // 对子节点递归调用，增加缩进
        for (FileSystemComponent component : children) {
            component.print(prefix + "  ");
        }
    }
}

// 4. 客户端代码
public class CompositeExample {
    public static void main(String[] args) {
        // 创建文件
        FileSystemComponent file1 = new File("document.txt", 1024);
        FileSystemComponent file2 = new File("image.jpg", 204800);
        FileSystemComponent file3 = new File("data.csv", 5120);
        FileSystemComponent file4 = new File("notes.txt", 2048);

        // 创建子文件夹
        Directory subDir = new Directory("资料");
        subDir.add(file3);
        subDir.add(file4);

        // 创建根文件夹
        Directory rootDir = new Directory("我的文档");
        rootDir.add(file1);
        rootDir.add(file2);
        rootDir.add(subDir);

        // 打印整个文件系统结构（透明地处理单个文件和文件夹）
        System.out.println("文件系统结构:");
        rootDir.print("");

        // 计算并显示总大小
        System.out.println("\n总大小: " + rootDir.getSize() + " bytes");
    }
}

